# -*- coding: utf-8 -*-
"""
正则文法：
    描述词法规律（字符的顺序结合），不同的正则文法形成不同的 Token 类型；
BNF上下文无关文法：
    描述语法规律（Token的顺序结合），不同的BNF文法形成形成不同的 ASTNode 类型
"""

from enum import Enum

class TokenType(Enum):
    """一个简单的词法记号（Token）类型枚举，也就是为这门语言设计的合法记号"""
    IntLiteral = 1    # 整型字面量词法    0 | [1-9][0-9]*
    StringLiteral = 2    # 字符串字面量词法    '.*'

    # token具有二义性，例如，加号既可以表示数字加法，也可以表示线性表拼接，所以直接以形状命名
    Plus = 3    # 加号词法    +
    Minus = 4    # 减号词法    -
    Star = 5    # 星号词法    *
    Slash = 6    # 斜杠词法    /

    GT = 7    # 大于词法    >
    LT = 8    # 小于词法    <
    EQ = 9    # 等于词法    ==
    GE = 10    # 大于等于词法    >=
    LE = 11    # 小于等于词法    <=

    Semicolon = 12    # 分号词法    ;
    LeftParen = 13    # 左括号词法    (
    RightParen = 14    # 右括号词法    )
    
    Int = 15    # 某关键字词法    int
    String = 16    # 某关键字词法    string
    Bool = 17    # 某关键字词法    bool
    
    Identifier = 18    # 标识符词法    [a-zA-Z][a-zA-Z0-9_]*
    Assignment = 19    # 赋值词法    =

    If = 20    # 某关键字词法    if
    Else = 21    # 某关键字词法    else
    While = 22    # 某关键字词法    while
    For = 23    # 某关键字词法    for
    Break = 24    # 某关键字词法    break
    Continue = 25    # 某关键字词法    continue
    BTrue = 26    # 某关键字词法    true
    BFalse = 27    # 某关键字词法    false

    And = 28    # 某关键字词法    and
    Or = 29    # 某关键字词法    or


class ASTNodeType(Enum):
    """上下文无关文法，采用 BNF 格式
    Program: ExpressionStmt+
    ExpressionStmt: IntDeclaration | AssignmentExpressionStmt | AdditiveExpressionStmt

    IntDeclaration: Int Identifier Semicolon | Int AssignmentExpression Semicolon
    AssignmentExpression: Identifier Assignment AdditiveExpression
    AdditiveExpression: MultiplicativeExpression | AdditiveExpression Plus MultiplicativeExpression
    MultiplicativeExpression: Primary | MultiplicativeExpression Star Primary
    Primary: Identifier | IntLiteral | LeftParen AdditiveExpression RightParen
    
    AssignmentExpressionStmt: AssignmentExpression Semicolon

    AdditiveExpressionStmt: AdditiveExpression Semicolon    
    """
    Program = 1    # 程序入口，根节点

    ExpressionStmt = 2    # 一个完整的语句

    IntDeclaration = 3    # 整型变量声明语句

    AssignmentExpressionStmt = 4    # 变量赋值语句

    AdditiveExpressionStmt = 5    # 加法表达式语句

    AssignmentExpression = 6    # 赋值表达式

    AdditiveExpression = 7    # 加法表达式

    MultiplicativeExpression = 8    # 乘法表达式

    Primary = 9    # 终结符Token

    Identifier = 10    # 变量终结符

    IntLiteral = 11    # 整型字面量终结符

    Paren = 12    # 括号分组

    BoolExpression = 13    # 布尔运算表达式
    Comparision = 14    # 比较运算表达式
